/* 
Symbol
自ECMAScript 2015起，symbol成为了一种新的原生类型，就像number和string一样。
symbol类型的值是通过Symbol构造函数创建的。

可以传递参做为唯一标识 只支持 string 和 number类型的参数

Symbol的值是唯一的

用作对象属性的键
*/

let symbol01:symbol = Symbol('1')   // 唯一的
let symbol02:symbol = Symbol('1')   // 唯一的

console.log(symbol01 === symbol02)   // false
// for Symbol 
/* 
for全局循环
symbol有没有注册过这个key
如果有直接拿来用（第二次）
如果没有的话 就去创建一个（第一次）
*/
console.log(Symbol.for('xiaoli') === Symbol.for('xiaoli'))  // true

let objSymbol01 = {
  name: 1,
  // symbol01: 111,
  // symbol02: 222
  [symbol01]: 111,
  [symbol02]: 222
}

console.log(objSymbol01)  // { name: 1, [Symbol(1)]: 111, [Symbol(1)]: 222 }

// for in 不能读到symbol
for(let k in objSymbol01) {
  console.log(k)
}

// keys 不能读到symbol
console.log(Object.keys(objSymbol01))

// getOwnPropertyNames 不能读到symbol
console.log(Object.getOwnPropertyNames(objSymbol01))

// getOwnPropertySymbols 可以取到symbol,但是其他属性取不到
console.log(Object.getOwnPropertySymbols(objSymbol01))

// Reflect反射 可以取到正常属性和symbol
console.log(Reflect.ownKeys(objSymbol01))
